package br.com.pmz.utilidades.util;

import java.util.Collection;

import org.apache.log4j.Logger;

/**
 * @author Pedro
 *
 */
public abstract class Util {

    /**
     * Gera o Log do sistema.
     */
    private static final Logger LOG = Logger.getLogger(Util.class);

    /**
     * Classe utilitária nunca é instanciada.
     */
    protected Util() {

    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final Object obj) {
        LOG.debug("Object");
        return obj == null;
    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final String obj) {
        LOG.debug("String");
        return empty((Object) obj) || obj.equals("");
    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final StringBuffer obj) {
        LOG.debug("StringBuffer");
        return empty((Object) obj) || obj.length() == 0;
    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final Integer obj) {
        LOG.debug("Integer");
        return empty((Object) obj);
    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final Collection < ? > obj) {
        LOG.debug("Collection");
        return empty((Object) obj) || obj.size() == 0;
    }

    /**
     * Valida se o objeto passado está vazio.
     *
     * @param obj Objeto que será validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean empty(final Long obj) {
        LOG.debug("Long");
        return empty((Object) obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final Object obj) {
        LOG.debug("Object");
        return !empty(obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final String obj) {
        LOG.debug("String");
        return !empty(obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final StringBuffer obj) {
        LOG.debug("StringBuffer");
        return !empty(obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final Integer obj) {
        LOG.debug("Integer");
        return !empty(obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final Long obj) {
        LOG.debug("Long");
        return !empty(obj);
    }

    /**
     * Valida se o objeto passado n&atilde;o est&aacute; vazio.
     *
     * @param obj Objeto que ser&aacute; validado.
     * @return True caso o objeto esteja vazio.
     */
    public static final boolean notEmpty(final Collection < ? > obj) {
        LOG.debug("Collection");
        return !empty(obj);
    }
}
